PUSH AND POP
inputの値が0の場合はスタックからPOPしてoutputへ出力、inputの値が0以外の場合はスタックへPUSHする。
コード
code:push_and_pop
const add 0
const add_ri 64
const add_ii 192
const sub 1
const sub_ri 65
const jeq 32
const jeq_ii 224
const jlt 34
const jlte 35
const sw 16
const lw 17
const r0 0
const r1 1
const r2 2
const r3 3
const r4 4
const r5 5
const sp 5
const counter 6
const input 7
const output 7
const val 1
# init
add
r0
r0
sp
# main
label main_loop
add
input
r0
val
jeq
val
r0
pop_value
# push
sub_ri
sp
1
sp
sw
sp
r0
val
jeq
r0
r0
main_loop
# pop
label pop_value
lw
sp
r0
val
add_ri
sp
1
sp
add
val
r0
output
jeq
r0
r0
main_loop
スタックの挙動の整理
SPレジスタ
スタックの一番上の値のアドレス
PUSH
RAM_Address = SP + 1
RAM_Save = 1
RAM_Load = 0
RAM_Save value = value
SP_Next = SP + 1
POP
RAM_Address = SP
RAM_Save = 0
RAM_Load = 1
RAM_Save value = (何でもいい)
SP_Next = SP - 1